package fixmodel.decor;

import fixmodel.base.Quack;
import fixmodel.observable.Observable;
import fixmodel.observable.Observer;

/**使用装饰者模式 给鸭子一些新的行为(计算次数的行为) 我们不必修改鸭子的代码
 * 像适配器一样 我们需要实现目标接口
 * @author yaojianfeng
 */
public class QuackCounter implements Quack {
    private Observable observable;



    /**
     * 我们用一个实例变量来记录被装饰的呱呱叫者
     */
    private Quack duck;
    /**
     * 我们用静态变量跟踪所有的呱呱叫次数
     */
    private static int numberOfQuacks;

    /**
     * 将 Quack 当做参数传入构造器中,并记录在实例变量中
     * @param duck 鸭子对象
     */
    public QuackCounter(Quack duck) {
        this.duck = duck;
        observable = new Observable(this);
    }

    /**
     * 当 quack() 被调用时候,我们就把调用委托给正在装饰的quack对象
     * 然后把叫声的次数加1
     */
    @Override
    public void quack() {
        duck.quack();
        numberOfQuacks++;
        notifyObservers();
    }

    /**
     * 获取叫声次数
     * @return 次数
     */
    public static int getNumberOfQuacks(){
        return numberOfQuacks;
    }

    /**
     * 注册方法
     *
     * @param observer 被观察者
     */
    @Override
    public void registerObserver(Observer observer) {
        observable.registerObserver(observer);
    }

    /**
     * 通知观察者
     */
    @Override
    public void notifyObservers() {
        observable.notifyObservers();
    }
}
